#include <iostream>

using namespace std;

/*
 * 类模板配合全局函数
 *  1、全局函数类内实现  直接在类内声明友元即可
 *  2、全局函数类外实现  需要让编译器提前知道全局函数的存在
 */

template<class T1, class T2>
class Person;  // 提前让编译器知道person类模板的存在

template<class T1, class T2>
void print2(Person<T1, T2> & p){   // 提前让编译器知道全局函数存在
    cout << "类外实现--name：" << p.p_name << ", age:" << p.p_age << endl;
}

template<typename T1, typename T2>
class Person{
    friend void print1(Person<T1, T2> & p){   // 类内实现
        cout << "类内实现--name：" << p.p_name << ", age:" << p.p_age << endl;
    }

    friend void print2<>(Person<T1, T2> & p);  // 类外实现
public:
    Person(T1 name, T2 age){
        this->p_name = name;
        this->p_age = age;
    }
private:
    T1 p_name;
    T2 p_age;
};

void test01(){
    Person<string, int>p("tom", 18);
    print1(p);
}

void test02(){
    Person<string, int>p("jerry", 19);
    print2(p);
}

int main() {
    test01();
    test02();

    return 0;
}
